//package com.qzh.summer;
//
//import lombok.EqualsAndHashCode;
//
//import java.io.File;
//import java.io.IOException;
//import java.lang.reflect.Field;
//import java.net.URL;
//import java.util.ArrayList;
//import java.util.Enumeration;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.jar.JarEntry;
//import java.util.jar.JarFile;
//
//
///**
// * 注解扫描类
// */
//public class AnnotationScanner {
//
//    public static Map<String, List<Field>> scanPackageForAnnotatedFields(String packageName) {
//        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//        String path = packageName.replace('.', '/');
//        Enumeration<URL> resources = null;
//        try {
//            resources = classLoader.getResources(path);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//        Map<String, List<Field>> annotatedFieldsMap = new HashMap<>();
//        while (resources.hasMoreElements()) {
//            URL resource = resources.nextElement();
//            String resourcePath = resource.getPath();
//
//            // 如果是 jar 包
//            if (resourcePath.endsWith(".jar")) {
//                scanJarFileForAnnotatedFields(resourcePath, packageName, annotatedFieldsMap);
//            } else { // 如果是目录
//                scanDirectoryForAnnotatedFields(resourcePath, packageName, annotatedFieldsMap);
//            }
//        }
//
//        return annotatedFieldsMap;
//
//    }
//
//    private static void scanJarFileForAnnotatedFields(String jarPath, String packageName, Map<String, List<Field>> annotatedFieldsMap) {
//        try (JarFile jarFile = new JarFile(jarPath)) {
//            Enumeration<JarEntry> entries = jarFile.entries();
//            while (entries.hasMoreElements()) {
//                JarEntry entry = entries.nextElement();
//                String entryName = entry.getName();
//                if (entryName.endsWith(".class")) {
//                    String className = entryName.substring(0, entryName.length() - 6);
//                    className = className.replace('/', '.');
//                    if (className.startsWith(packageName)) {
//                        Class<?> clazz = Class.forName(className);
//                        collectAnnotatedFields(clazz, annotatedFieldsMap);
//                    }
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    private static void scanDirectoryForAnnotatedFields(String directoryPath, String packageName, Map<String, List<Field>> annotatedFieldsMap) {
//        File directory = new File(directoryPath);
//        File[] files = directory.listFiles();
//        if (files != null) {
//            for (File file : files) {
//                if (file.isDirectory()) {
//                    scanDirectoryForAnnotatedFields(file.getAbsolutePath(), packageName + "." + file.getName(), annotatedFieldsMap);
//                } else if (file.getName().endsWith(".class")) {
//                    String className = file.getName().substring(0, file.getName().length() - 6);
//                    className = className.replace('/', '.');
//                    if (className.startsWith(packageName)) {
//                        try {
//                            Class<?> clazz = Class.forName(className);
//                            collectAnnotatedFields(clazz, annotatedFieldsMap);
//                        } catch (ClassNotFoundException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//            }
//        }
//    }
//
//    private static void collectAnnotatedFields(Class<?> clazz, Map<String, List<Field>> annotatedFieldsMap) {
//        Field[] fields = clazz.getDeclaredFields();
//        for (Field field : fields) {
//            if (field.isAnnotationPresent(EqualsAndHashCode.Include.class)) {
//               EqualsAndHashCode.Include annotation = field.getAnnotation(EqualsAndHashCode.Include.class);
//                String key = annotation.value().isEmpty() ? field.getName() : annotation.value();
//                annotatedFieldsMap.putIfAbsent(key, new ArrayList<>());
//                annotatedFieldsMap.get(key).add(field);
//            }
//        }
//    }
//
